﻿using System;
using System.Linq.Expressions;
using Expression_ = System.Linq.Expressions.Expression;

namespace MoroMoro.Samples.ToDoList.Base.Domain.Specifications
{
    /// <summary>
    /// 二つの仕様のいずれかを満たすことで真となる仕様を表します。
    /// </summary>
    /// <typeparam name="TEntity">エンティティの型。</typeparam>
    /// <seealso cref="Specifications.Specification&lt;TEntity&gt;"/>
    [Serializable]
    internal sealed class OrSpecification<TEntity> : BinarySpecification<TEntity>
        where TEntity : class
    {
        /// <summary>
        /// <see cref="OrSpecification&lt;TEntity&gt;"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="left">一つ目の仕様。null の場合は常に偽を示す仕様で置き換えられます。</param>
        /// <param name="right">二つ目の仕様。null の場合は常に偽を示す仕様で置き換えられます。</param>
        public OrSpecification(Specification<TEntity> left, Specification<TEntity> right)
            : base(left ?? Specification<TEntity>.False, right ?? Specification<TEntity>.False)
        {
        }


        /// <inheritdoc/>
        protected override BinaryExpression CreateBody(Expression left, Expression right)
        {
            return Expression_.OrElse(left, right);
        }
    }
}
